草庐IT

C++ union 与 reinterpret_cast

全部标签

c++ - reinterpret_cast<char*>(p) 或 static_cast<char*>((void*)p)) 用于字节指针差异,哪个更好?

在提取用于指针运算的原始字节指针时,以下三种类型转换之间有什么区别吗?(假设char为1个字节的平台。)static_cast((void*)ptr))reinterpret_cast(ptr)(更新)或:static_cast(static_cast(ptr))我应该选择哪个?更详细...给定一个类中两个成员对象的指针,我想计算一个到另一个的偏移量,这样我就可以在给定偏移量的情况下重建一个成员的地址和另一个成员的地址。//assumeddatalayout:structC{//...Aa;//...Bb;}我目前使用的代码是这样的:voidapproach1(A*pa,B*pb){/

C++(以某种方式)将结构限制为父 union 大小

我正在尝试创建一个可变大小的颜色类-给定一个模板确定的值数组,我想为数组中的每个值创建命名别名,即:templateclassColor{public:union{Tv[C];struct{Tr,g,b,a;};};};但是,如果我尝试对C=3使用相同的类,union要求大小为4个字节(“a”成员)。或者,使用a的数学表达的位域大小(名为a的结构,匿名T成员,大小在C>3时计算为1),编译器发出一个许可警告(不可抑制,根据Ingcc,howtomutethe-fpermissivewarning?),这是不适合的更大规模的API。我将如何允许单个类处理不同数量的变量,同时保留每个变量的

c++ - C++ 语言标准对 static_cast 如何处理减小整数的大小有何规定?

我想知道C++语言标准针对以下情况指定的规则:longx=200;shorty=static_cast(x);y是否保证为200,还是标准将其留给实现来决定?各种编译器对标准的遵守程度如何? 最佳答案 在本例中为static_cast是一个“显式类型转换”。该标准对4.7/3“积分转换”中的积分转换有这样的说法:Ifthedestinationtypeissigned,thevalueisunchangedifitcanberepresentedinthedestinationtype(andbit-fieldwidth);othe

c++ - 编译器切换到禁用 c 风格转换中的 const_cast 语义?

最近我偶然发现了这样的代码:voidfoo(constBar*b){...takes_nonconst_param_fn((Bar*)b);...显然,开发人员并不知道他在做什么,但如果编译器没有默默地接受c-style-cast并且至少需要一个适当的const_cast,他可能已经知道了在提交之前两次。所以这让我开始思考,现代编译器是否有一个开关来防止const_castc风格转换的语义?防止所有c-style-casts的出现根本不切实际,允许它们的static_和reinterpret_语义是必要的邪恶(如果仅用于某些库代码),但我的印象是,在C++代码库中,合法使用c-styl

c++ - 在 union 中获取 sizeof 匿名结构

我希望这不是一个重复的问题,但我已经进行了一些详细搜索,但之前没有找到我的确切案例。我有一个简单的结构,我也希望能够将其作为简单的字节数组进行访问union{struct{unsignedchara;unsignedcharb;//...Someothermembers...unsignedcharw;};unsignedcharbytes[sizeof(what?)];}myUnion;请注意,该结构没有命名,也没有给它自己的成员名称。这样我就可以使用myUnion.a访问该成员,而不是myUnion.myStruct.a。但是,如果没有一些名称,除了每次更改内容时手动计算之外,我如

c++ - static_cast 从基析构函数到指向派生类的指针的安全性

这是问题的变体DowncastingusingtheStatic_castinC++和Safetyofinvaliddowncastusingstatic_cast(orreinterpret_cast)forinheritancewithoutaddedmembers关于~B中的行为,我不清楚标准中的短语“B实际上是D类型对象的子对象,结果指针指向D类型的封闭对象”。如果在~B中转换为D,此时它仍然是子对象吗?以下简单示例显示了问题:voidf(B*b);classB{public:B(){}~B(){f(this);}};classD:publicB{public:D(){}};s

c++ - 是否尝试修改 const_cast-ed,但动态分配的常量对象仍然是未定义的行为?

这个问题在这里已经有了答案:Canaheap-allocatedobjectbeconstinC++?(6个答案)关闭7年前。例如:constint*pc=newconstint(3);//notetheconstint*p=const_cast(pc);*p=4;//undefinedbehavior?特别是,编译器能否优化掉分配给堆的*pc?如果不是,尝试通过p修改*pc是否仍然构成未定义的行为-如果是,为什么?

c++ - 如何使用 dynamic_cast 正确向下转换?

我对dynamic_cast很困惑.来自C++Primer和cppreference的Material(规则5)不能帮助我理解。(cppreference比书难得多,我都非常仔细地阅读了它们)来自C++Primer5th:dynamic_cast(e)Inallcases,thetypeofemustbeeitheraclasstypethatispubliclyderivedfromthetargettype,apublicbaseclassofthetargettype,orthesameasthetargettype.Ifehasoneofthesetypes,thentheca

c++ - set_union 与 multiset 容器?

当一个或两个输入容器是具有重复对象的多重集时,算法std:set_union的返回值是多少?dups会迷路吗?让我们假设例如:multisetms1;ms1.insert(1);ms1.insert(1);ms1.insert(1);ms1.insert(2);ms1.insert(3);multisetms2;ms2.insert(1);ms2.insert(1);ms2.insert(2);ms2.insert(2);ms2.insert(4);vectorv(10);set_union(ms1.begin(),ms1.end(),ms2.begin(),ms2.end(),v.b

c++ - dynamic_cast 通常是如何实现的?

类型检查仅仅是整数比较吗?或者有一个GetTypeId虚拟函数来区分哪个使其成为整数比较有意义吗?(只是不想让事情成为类名上的字符串比较)编辑:我的意思是,如果我经常期待错误的类型,使用类似的东西是否有意义:structToken{enum{AND,OR,IF};virtualstd::size_tGetTokenId()=0;};structAndToken:publicToken{std::size_tGetTokenId(){returnAND;}};并使用GetTokenId成员而不是依赖于dynamic_cast。 最佳答案